我偶然发现了这段代码这似乎完全以打破我的,但它确实发生this
的null
.我只是不明白这是怎么回事null
它在一个普通的方法调用中,如
myObject->func();
在里面MyObject::func()
我们有
if (!this) { return false; }
有没有什么方法可以让第一行抛出NullPointerException
而不是进入null
(?)方法?
如果你有:
MyObject *o = NULL; o->func();
接下来会发生什么取决于是否func
是虚拟的.如果是,那么它将崩溃,因为它需要一个对象来获取vtable.但是如果它不是虚拟的,则调用继续将this指针设置为NULL.
我相信标准说这是"未定义的行为",所以任何事情都可能发生,但是典型的编译器只是生成代码而不检查指针是否为NULL.一些众所周知的库依赖于我所描述的行为:MFC有一个类似于SafeGetHandle
可以在空指针上调用的函数,在这种情况下返回NULL.
您可能想要编写可重用的辅助函数:
void CheckNotNull(void *p) { if (p == NULL) throw NullPointerException(); }
然后,您可以在函数的开头使用它来检查其所有参数,包括this
:
CheckNotNull(this);